let & const
为啥需要let和const?
因为JavaScript没有块级作用域,只有函数作用域。
|
|
这很蛋疼!
let 和 const就是来解决作用域问题的!
注意: 使用let 或者 const 会默认使用严格模式 “use strict“
let
let 和var类似,但是let声明的变量只在它所处的代码块有效
|
|
看一个经典笔试题
|
|
使用var声明的变量i是全局变量,在全局范围内有效,也就是说只有一个i,每次循环i的值都会发生改变,数组a中每个成员的console.log(i)其实是同一个i,也就是全局变量i,所以从a[0]~a[9]打出的都是10。
|
|
使用let声明的i只在本轮循环有效,每次循环都会重新声明i,每一次console.log()的i都是不同的i,JavaScript引擎会记住上次循环的值,在本次循环会自动基于上次循环继续。
let没有变量提升
使用var会产生变量提升,允许变量在未声明之前使用,值为undefined,这很奇怪。使用let不允许未声明先使用,这会报错。
|
|
let 不允许重复声明
在同一个作用域内let不允许重复声明一个变量。
|
|
const
const声明一个只读的常量。一旦声明,常量的值就不能改变。const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
其实const保证的不是变量的值不能改动,而是保证变量指向的那个内存地址不得改动。对于简单类型数据(数值,字符串,布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但是对于复杂类型的数据(对象,数组),对象指向的内存地址保存的是一个指针,const只能保证这个指针是固定的,而无法保证其内部的数据结构不变。
|
|
Map & Set
Set
- set 类似数组但是成员值都是唯一的,没有重复。